package com.yf.exam.modules.paper.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yf.ability.log.annon.LogInject;
import com.yf.ability.log.enums.LogType;
import com.yf.base.api.api.ApiRest;
import com.yf.base.api.api.controller.BaseController;
import com.yf.base.api.api.dto.BaseIdReqDTO;
import com.yf.base.api.api.dto.BaseIdRespDTO;
import com.yf.base.api.api.dto.PagingReqDTO;
import com.yf.exam.modules.paper.dto.PaperDTO;
import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO;
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO;
import com.yf.exam.modules.paper.dto.request.PaperCreateReqDTO;
import com.yf.exam.modules.paper.dto.request.PaperHandReqDTO;
import com.yf.exam.modules.paper.dto.request.PaperListReqDTO;
import com.yf.exam.modules.paper.dto.request.PaperQuQueryDTO;
import com.yf.exam.modules.paper.dto.response.*;
import com.yf.exam.modules.paper.service.PaperService;
import com.yf.repo.enums.QuType;
import com.yf.system.modules.user.UserUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
* <p>
* 试卷控制器
* </p>
*
* @author 聪明笨狗
* @since 2020-05-25 16:33
*/
@Api(tags={"试卷"})
@RestController
@RequestMapping("/api/paper/paper")
public class PaperController extends BaseController {

    @Autowired
    private PaperService baseService;



    /**
     * 分页查找
     * @param reqDTO
     * @return
     */
    @RequiresPermissions("exam:list")
    @ApiOperation(value = "分页查找")
    @PostMapping("/paging")
    public ApiRest<IPage<PaperListRespDTO>> paging(@RequestBody PagingReqDTO<PaperListReqDTO> reqDTO) {

        //分页查询并转换
        IPage<PaperListRespDTO> page = baseService.paging(reqDTO);

        return super.success(page);
    }




    /**
     * 分页查找
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "查找我的试卷")
    @PostMapping("/my-paging")
    public ApiRest<IPage<PaperListRespDTO>> myPaging(@RequestBody PagingReqDTO<PaperListReqDTO> reqDTO) {


        // 用户试卷
        PaperListReqDTO params = reqDTO.getParams();
        if(params == null){
            params = new PaperListReqDTO();
        }
        params.setUserId(UserUtils.getUserId());
        reqDTO.setParams(params);

        //分页查询并转换
        IPage<PaperListRespDTO> page = baseService.myPaging(reqDTO);

        return super.success(page);
    }




    /**
     * 检测用户有没有中断的考试
     * @return
     */
    @ApiOperation(value = "检测进行中的考试")
    @PostMapping("/check-process")
    public ApiRest<PaperDTO> checkProcess() {
        //复制参数
        PaperDTO dto = baseService.checkProcess(UserUtils.getUserId());
        return super.success(dto);
    }



    /**
     * 创建试卷
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "创建试卷")
    @PostMapping("/create-paper")
    public ApiRest<BaseIdRespDTO> save(@RequestBody PaperCreateReqDTO reqDTO) {
        //复制参数
        String paperId = baseService.createPaper(
                UserUtils.getUserId(),
                UserUtils.departCode(),
                reqDTO.getExamId(),
                reqDTO.getPassword(),
                reqDTO.getFaceToken(),
                reqDTO.getCourseId()
                );
        return super.success(new BaseIdRespDTO(paperId));
    }


    /**
     * 批量删除
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "试卷详情")
    @PostMapping("/paper-detail")
    public ApiRest<ExamDetailRespDTO> paperDetail(@RequestBody BaseIdReqDTO reqDTO) {
        //根据ID删除
        ExamDetailRespDTO respDTO = baseService.paperDetail(reqDTO.getId());
        return super.success(respDTO);
    }

    /**
     * 题目详情
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "题目详情")
    @PostMapping("/qu-detail")
    public ApiRest<PaperQuDetailDTO> quDetail(@RequestBody PaperQuQueryDTO reqDTO) {
        //查找详情
        PaperQuDetailDTO respDTO = baseService.findQuDetail(reqDTO.getPaperId(), reqDTO.getQuId());

        // 清除答案
        List<PaperQuAnswerExtDTO> list = respDTO.getAnswerList();


        if(!CollectionUtils.isEmpty(list)){

            // 填空题清理
            if(QuType.FILL.equals(respDTO.getQuType())){
                for(PaperQuAnswerExtDTO item: list){
                    item.setContent(null);
                }
            }else{
                for(PaperQuAnswerExtDTO item: list){
                    item.setIsRight(null);
                }
            }
        }

        // 隐藏是否正确
        respDTO.setForExam(true);
        respDTO.setIsRight(null);

        return super.success(respDTO);
    }

    /**
     * 填充答案
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "填充答案")
    @PostMapping("/fill-answer")
    public ApiRest<FillRespDTO> fillAnswer(@RequestBody PaperQuDetailDTO reqDTO) {
        //根据ID删除
        Boolean fill = baseService.fillAnswer(reqDTO);
        FillRespDTO respDTO = new FillRespDTO();
        respDTO.setFill(fill);
        return super.success(respDTO);
    }


    /**
     * 离开计数器
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "离开计数器")
    @PostMapping("/leave-incr")
    public ApiRest<LeaveCheckRespDTO> leave(@RequestBody BaseIdReqDTO reqDTO) {
        //根据ID删除
        LeaveCheckRespDTO respDTO = baseService.leave(reqDTO.getId());
        return super.success(respDTO);
    }




    /**
     * 交卷操作
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "交卷操作")
    @PostMapping("/hand-exam")
    public ApiRest<PaperQuDetailDTO> handleExam(@RequestBody PaperHandReqDTO reqDTO) {
        //根据ID删除
        baseService.handExam(reqDTO.getId(), reqDTO.getExState(), "");
        return super.success();
    }


    /**
     * 批量删除
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "试卷详情")
    @PostMapping("/paper-result")
    public ApiRest<ExamResultRespDTO> paperResult(@RequestBody BaseIdReqDTO reqDTO) {
        //根据ID删除
        ExamResultRespDTO respDTO = baseService.paperResult(reqDTO.getId());
        return super.success(respDTO);
    }


    /**
     * 提交阅卷
     * @param reqDTO
     * @return
     */
    @RequiresPermissions("exam:review:list")
    @LogInject(title="提交批阅试卷", logType = LogType.EXAM)
    @ApiOperation(value = "提交阅卷")
    @PostMapping("/review-paper")
    public ApiRest<PaperQuDetailDTO> reviewPaper(@RequestBody ExamResultRespDTO reqDTO) {
        //根据ID删除
        baseService.reviewPaper(reqDTO);
        return super.success();
    }

    /**
     * 测试主观题分数
     * @param reqDTO
     */
    @PostMapping("/getScore")
    public void getScore(@RequestBody BaseIdReqDTO  reqDTO){
        baseService.PaperServicei(reqDTO.getId());
    }
}
